package org.lex.game.sudoku.model;

import ms.sudoku.util.IntSet;

import org.lex.game.sudoku.model.SudokuModelListener.Cause;
import org.lex.game.sudoku.model.builder.SudokuBuilder;

public interface SudokuModel {
	// ///////////////////////
	// change model properties
	// ///////////////////////
	void newGame(SudokuBuilder builder);

	void reset();

	void set(Cause cause, int row, int column, int value);

	// ////////////////////
	// get model properties
	// ////////////////////
	int getBoxSize();

	int getGridSize();

	int get(int row, int column);

	int getOriginalEmptyCellsCount();

	int getCurrentEmptyCellsCount();

	IntSet getHints(int row, int column);

	int[][] toArray();

	// //////////////////////
	// check model properties
	// //////////////////////
	boolean isCompleted();

	boolean isEditable(int row, int column);

	CheckResult checkCell(int row, int column, boolean findAllInvalid);

	CheckResult checkAll(boolean findAllInvalid);

	boolean checkCanFillWith(int row, int col, int num);

	// //////////////////////
	// event support
	// //////////////////////
	void addListener(SudokuModelListener listener);

	void removeListener(SudokuModelListener listener);

	// //////////////////////
	// toString
	// //////////////////////
	String toString();

	String dump();
}
